﻿using System;
using System.Collections.Generic;
using GameStepAzure.Areas.Admin.Models;
using System.Linq;

namespace GameStepAzure.Models
{
    public class FachadaProductos : IFachadaProductos
    {
        public Producto BuscaProducto(Producto producto)
        {
            List<Producto> lst = ListarProductos();
            Predicate<Producto> pred = o => o.Id == producto.Id && o.Consola == o.Consola;
            if (lst.Exists(pred))
            {
                return lst.Find(pred);
            }
            else
            {
                return null;
            }
        }

        public List<Producto> ListarProductosIndex()
        {
            using (GameStoreEntities context = new GameStoreEntities())
            {
                List<Productos> lstEntidades = context.Productos.ToList().FindAll(x => x.Id % 4 == 0 && x.Tipo == (int)TipoProducto.VideoJuego).ToList();

                List<Producto> result = new List<Producto>();
                foreach (Productos p in lstEntidades)
                {
                    result.Add(GameStoreMapper.ProductoEntityToModel(p));
                }

                return result;
            }
        }

        public List<Producto> ListarProductos()
        {
            List<Producto> productos = new List<Producto>();
            productos.AddRange(ListarProductosPS3());
            productos.AddRange(ListarAccesoriosPS3());
            productos.AddRange(ListarProductosXbox());
            productos.AddRange(ListarAccesoriosXbox());
            productos.AddRange(ListarProductosPsVita());
            productos.AddRange(ListarAccesoriosPsVita());
            productos.AddRange(ListarProductos3DS());
            productos.AddRange(ListarAccesorios3DS());
            productos.AddRange(ListarProductosWii());
            productos.AddRange(ListarAccesriosWii());

            return productos;
        }

        public List<Producto> ListarProductosPS3()
        {
            return Listar("PS3", TipoProducto.VideoJuego);
        }

        public List<Producto> ListarAccesoriosPS3()
        {
            return Listar("PS3", TipoProducto.Accesorio);
        }

        public List<Producto> ListarProductosXbox()
        {
            return Listar("Xbox", TipoProducto.VideoJuego);
        }

        public List<Producto> ListarAccesoriosXbox()
        {
            return Listar("Xbox", TipoProducto.Accesorio);
        }

        public List<Producto> ListarProductosPsVita()
        {
            return Listar("Psvita", TipoProducto.VideoJuego);
        }

        public List<Producto> ListarAccesoriosPsVita()
        {
            return Listar("Psvita", TipoProducto.Accesorio);
        }

        public List<Producto> ListarProductos3DS()
        {
            return Listar("3DS", TipoProducto.VideoJuego);
        }

        public List<Producto> ListarAccesorios3DS()
        {
            return Listar("3DS", TipoProducto.Accesorio);
        }

        public List<Producto> ListarProductosWii()
        {
            return Listar("Wii", TipoProducto.VideoJuego);
        }

        public List<Producto> ListarAccesriosWii()
        {
            return Listar("Wii", TipoProducto.Accesorio);
        }

        private List<Producto> Listar(string consola, TipoProducto tipo)
        {
            using (GameStoreEntities context = new GameStoreEntities())
            {
                List<Productos> lstEntidades = context.Productos.ToList().FindAll(x => x.Consola.Equals(consola) && x.Tipo == (int)tipo).ToList();

                List<Producto> result = new List<Producto>();
                foreach (Productos p in lstEntidades)
                {
                    result.Add(GameStoreMapper.ProductoEntityToModel(p));
                }

                return result;
            }
        }
    }
}